package com.caipiao.util;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.nio.file.StandardCopyOption;
import java.util.Objects;
import javax.imageio.ImageIO;
import java.util.Random;

/**
 * TODO
 *
 * @author abc
 * @version 1.0
 * @date 2025/8/7 15:42
 */
public class VrImgUtile {


    /**
     * 将指定目录下的所有文件和子目录中的文件复制到目标目录下，
     * 并在文件名前添加指定前缀，同时将文件名和扩展名转为小写
     *
     * @param sourceDir 源目录路径
     * @param targetDir 目标目录路径
     * @param prefix    文件名前缀
     * @throws IOException 当IO操作出现异常时抛出
     */
    public static void copyFilesWithPrefix(String sourceDir, String targetDir, String prefix) throws IOException {
        // 检查源目录是否存在
        Path sourcePath = Paths.get(sourceDir);
        if (!Files.exists(sourcePath) || !Files.isDirectory(sourcePath)) {
            throw new IOException("源目录不存在或不是一个目录: " + sourceDir);
        }

        // 创建目标目录（如果不存在）
        Path targetPath = Paths.get(targetDir);
        if (!Files.exists(targetPath)) {
            Files.createDirectories(targetPath);
        }

        // 遍历源目录下的所有文件和子目录
        copyFilesRecursively(sourcePath, targetPath, prefix);
    }

    /**
     * 递归复制文件和目录
     *
     * @param sourcePath 源路径
     * @param targetPath 目标路径
     * @param prefix     文件名前缀
     * @throws IOException 当IO操作出现异常时抛出
     */
    private static void copyFilesRecursively(Path sourcePath, Path targetPath, String prefix) throws IOException {
        File sourceFile = sourcePath.toFile();

        // 遍历源目录下的所有文件和子目录
        for (File file : Objects.requireNonNull(sourceFile.listFiles())) {
            if (file.isDirectory()) {
                // 如果是目录，则递归处理
                copyFilesRecursively(file.toPath(), targetPath, prefix);
            } else {
                // 如果是文件，则复制并重命名
                String fileName = file.getName();
                String lowerCaseName = fileName.toLowerCase();

                // 分离文件名和扩展名
                int lastDotIndex = lowerCaseName.lastIndexOf('.');
                String nameWithoutExtension = lastDotIndex > 0 ? lowerCaseName.substring(0, lastDotIndex) : lowerCaseName;
                String extension = lastDotIndex > 0 ? lowerCaseName.substring(lastDotIndex) : "";

                // 构造新文件名：前缀 + 原文件名(小写) + 扩展名(小写)
                String newFileName = prefix + nameWithoutExtension + extension;

                // 复制文件到目标目录
                Path targetFile = targetPath.resolve(newFileName);
                Files.copy(file.toPath(), targetFile, StandardCopyOption.REPLACE_EXISTING);
            }
        }
    }

    /**
     * 压缩指定目录下大于5M的jpg图片
     * 
     * @param directoryPath 目录路径
     * @throws IOException 当IO操作出现异常时抛出
     */
    public static void compressLargeJpgImages(String directoryPath) throws IOException {
        Path dirPath = Paths.get(directoryPath);
        if (!Files.exists(dirPath) || !Files.isDirectory(dirPath)) {
            throw new IOException("指定路径不存在或不是一个目录: " + directoryPath);
        }
        
        compressJpgImagesRecursively(dirPath);
    }
    
    /**
     * 递归压缩jpg图片
     * 
     * @param directoryPath 目录路径
     * @throws IOException 当IO操作出现异常时抛出
     */
    private static void compressJpgImagesRecursively(Path directoryPath) throws IOException {
        File directory = directoryPath.toFile();
        
        for (File file : Objects.requireNonNull(directory.listFiles())) {
            if (file.isDirectory()) {
                // 递归处理子目录
                compressJpgImagesRecursively(file.toPath());
            } else if (isJpgImage(file) && isFileSizeExceedsLimit(file, 5 * 1024 * 1024)) {
                // 如果是jpg图片且文件大小超过5M，则进行压缩
                compressImage(file, 0.5f);
            }
        }
    }
    
    /**
     * 判断文件是否为jpg图片
     * 
     * @param file 文件
     * @return 是否为jpg图片
     */
    private static boolean isJpgImage(File file) {
        String fileName = file.getName().toLowerCase();
        return fileName.endsWith(".jpg") || fileName.endsWith(".jpeg");
    }
    
    /**
     * 判断文件大小是否超过指定限制
     * 
     * @param file 文件
     * @param sizeLimit 大小限制(字节)
     * @return 是否超过限制
     */
    private static boolean isFileSizeExceedsLimit(File file, long sizeLimit) {
        return file.length() > sizeLimit;
    }
    
    /**
     * 压缩图片文件
     * 
     * @param imageFile 图片文件
     * @param quality 压缩质量(0.0-1.0)
     * @throws IOException 当IO操作出现异常时抛出
     */
    private static void compressImage(File imageFile, float quality) throws IOException {
        // 注意：此处需要使用第三方库如Thumbnailator或Java Image I/O来实现图片压缩
        // 这里只是一个方法框架，实际实现需要添加相应的图片处理库
        throw new UnsupportedOperationException("图片压缩功能需要引入第三方库支持");
    }
    
    /**
     * 从指定的gif图片(tar包)中提取所有图片并存储到指定目录
     * 
     * @param tarFilePath gif图片文件路径
     * @param targetDir 目标存储目录
     * @throws IOException 当IO操作出现异常时抛出
     */
    public static void extractImagesFromGifTar(String tarFilePath, String targetDir) throws IOException {
        Path tarPath = Paths.get(tarFilePath);
        if (!Files.exists(tarPath) || !tarPath.toString().endsWith(".tar")) {
            throw new IOException("指定的gif图片文件不存在或不是tar格式: " + tarFilePath);
        }
        
        Path targetPath = Paths.get(targetDir);
        if (!Files.exists(targetPath)) {
            Files.createDirectories(targetPath);
        }
        
        // 解析tar文件并提取图片
        extractImagesFromTar(tarPath, targetPath);
    }
    
    /**
     * 从tar文件中提取图片文件
     * 
     * @param tarPath tar文件路径
     * @param targetPath 目标目录路径
     * @throws IOException 当IO操作出现异常时抛出
     */
    private static void extractImagesFromTar(Path tarPath, Path targetPath) throws IOException {
        // 注意：此处需要使用第三方库如Apache Commons Compress来处理tar文件
        // 这里只是一个方法框架，实际实现需要添加相应的tar处理库
        throw new UnsupportedOperationException("tar文件解压功能需要引入第三方库支持，如Apache Commons Compress");
    }

    public static void main(String[] args) {
        try {
            // 创建随机数字图片
            createRandomNumberImage(200, 100, "D:/test_data/random_number.png");

            // 创建水平线图片
            drawHorizontalLine(200, 100, "D:/test_data/horizontal_line.png", 50);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 创建指定宽高的画布，并生成包含6位随机数字的图片
     * 
     * @param width 图片宽度
     * @param height 图片高度
     * @param outputPath 输出图片路径
     * @throws IOException 当IO操作出现异常时抛出
     */
    public static void createRandomNumberImage(int width, int height, String outputPath) throws IOException {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        
        // 设置背景为白色
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);
        
        // 生成6位随机数字
        Random random = new Random();
        String randomNumber = String.format("%06d", random.nextInt(1000000));
        
        // 设置字体和颜色
        g2d.setColor(Color.BLACK);
        g2d.setFont(new Font("Arial", Font.BOLD, Math.min(width, height) / 10));
        
        // 计算文本位置，使其居中
        FontMetrics fm = g2d.getFontMetrics();
        int x = (width - fm.stringWidth(randomNumber)) / 2;
        int y = (height - fm.getHeight()) / 2 + fm.getAscent();
        
        // 绘制文本
        g2d.drawString(randomNumber, x, y);
        g2d.dispose();
        
        // 输出图片
        ImageIO.write(image, "png", new File(outputPath));
    }

    /**
     * 在画布上绘制一条水平线，线宽为5个像素
     * 
     * @param width 画布宽度
     * @param height 画布高度
     * @param outputPath 输出图片路径
     * @param yPosition 线条的垂直位置(Y坐标)
     * @throws IOException 当IO操作出现异常时抛出
     */
    public static void drawHorizontalLine(int width, int height, String outputPath, int yPosition) throws IOException {
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2d = image.createGraphics();
        
        // 设置背景为白色
        g2d.setColor(Color.WHITE);
        g2d.fillRect(0, 0, width, height);
        
        // 设置线条颜色为黑色，线宽为5个像素
        g2d.setColor(Color.BLACK);
        g2d.setStroke(new BasicStroke(5));
        
        // 绘制水平线
        g2d.drawLine(0, yPosition, width, yPosition);
        g2d.dispose();
        
        // 输出图片
        ImageIO.write(image, "png", new File(outputPath));
    }
}